import { Body, Controller, Delete, Get, Param, Post, Put, Query } from '@nestjs/common';
import { ApiOperation, ApiProperty, ApiTags } from '@nestjs/swagger';
import { ModelType } from '@typegoose/typegoose/lib/types';
import { IsNotEmpty } from 'class-validator'
import { InjectModel } from 'nestjs-typegoose';
import {Post as PostSchema} from './post.model'
//import { PostModel } from './post.model';

import {Crud} from 'nestjs-mongoose-crud'

//定义一个数据传输对象明确告知要什么数据类型
class CreatPostDto {
    @ApiProperty({ description: '帖子标题', example: '帖子标题1a' })
    @IsNotEmpty({message:'请填写标题'})  //声明这个title不为空的，如果为空给出message提示。
    title: string
    @ApiProperty({ description: '帖子内容', example: '帖子内容1a' })
    content: string
}


//在PostsController里面所有路由都会加上'posts'前缀。
@Crud({
    model:PostSchema,
    routes:{
        find:{
            decorators:[
                ApiOperation({summary:'帖子列表'})
            ]
        }
    }
})
@Controller('posts')
@ApiTags('帖子')
//用依赖注入的方式
export class PostsController {
    //一般来说依赖注入的东西声明都是在constructor里面，这样实例化这个类的时候就会去自动执行。
    constructor(
        //ModelType<xxx>是范型  ModelType表示是模型类，<>是子类别，具体类别是PostSchema
        //一定要加private或者public这个修饰符表示这个postModel是个对象级别的属性。
        @InjectModel(PostSchema) private readonly model:ModelType<PostSchema>
    ){}

}


/*用依赖注入
//定义一个数据传输对象明确告知要什么数据类型
class CreatPostDto {
    @ApiProperty({ description: '帖子标题', example: '帖子标题1a' })
    @IsNotEmpty({message:'请填写标题'})  //声明这个title不为空的，如果为空给出message提示。
    title: string
    @ApiProperty({ description: '帖子内容', example: '帖子内容1a' })
    content: string
}


//在PostsController里面所有路由都会加上'posts'前缀。
@Controller('posts')
@ApiTags('帖子')
//用依赖注入的方式
export class PostsController {
    //一般来说依赖注入的东西声明都是在constructor里面，这样实例化这个类的时候就会去自动执行。
    constructor(
        //ModelType<xxx>是范型  ModelType表示是模型类，<>是子类别，具体类别是PostSchema
        //一定要加private或者public这个修饰符表示这个postModel是个对象级别的属性。
        @InjectModel(PostSchema) private readonly postModel:ModelType<PostSchema>
    ){}

    @Get('/')  //这里面'/'不写也可以
    @ApiOperation({ summary: '帖子列表' })
    async index() {
        return await this.postModel.find()
    }

    @Post()
    @ApiOperation({ summary: '创建帖子' })
    //在express中用的是req,res取数据，nest用装饰器@Body（）取数据，但是装饰器不能单独存在，后面加一个变量表示把取得的数据传给他。
    //这表示的是从Body请求过来的数据body变量不是一个普通的值，而是要符合这个CreatPostDto传输对象的值，这是个前提。有了它之后这个接口就加上了类型约束。
    async create(@Body() creatPostDto: CreatPostDto) {
        await this.postModel.create(creatPostDto)
        return {
            success: true
        }
    }

    @Get(':id')
    @ApiOperation({ summary: '帖子详情' })
    async detail(@Param('id') id: string) {
        return await this.postModel.findById(id)

    }

    //修改资源的接口
    @Put(':id')
    @ApiOperation({ summary: '编辑帖子' })
    async update(@Param('id') id: string, @Body() updatePostDto: CreatPostDto) {
        await this.postModel.findByIdAndUpdate(id, updatePostDto)
        return {
            success: true
        }
    }

    //删除接口
    @Delete(':id')
    @ApiOperation({ summary: '删除帖子' })
    async remove(@Param('id') id: string) {
        await this.postModel.findByIdAndDelete(id)
        return {
            success: true
        }
    }
}
*/





/*最开始的写法
export class PostsController {
    @Get('/')  //这里面'/'不写也可以
    @ApiOperation({ summary: '帖子列表' })
    async index() {
        return await PostModel.find()
    }

    @Post()
    @ApiOperation({ summary: '创建帖子' })
    //在express中用的是req,res取数据，nest用装饰器@Body（）取数据，但是装饰器不能单独存在，后面加一个变量表示把取得的数据传给他。
    //这表示的是从Body请求过来的数据body变量不是一个普通的值，而是要符合这个CreatPostDto传输对象的值，这是个前提。有了它之后这个接口就加上了类型约束。
    async create(@Body() creatPostDto: CreatPostDto) {
        await PostModel.create(creatPostDto)
        return {
            success: true
        }
    }

    @Get(':id')
    @ApiOperation({ summary: '帖子详情' })
    async detail(@Param('id') id: string) {
        return await PostModel.findById(id)

    }

    //修改资源的接口
    @Put(':id')
    @ApiOperation({ summary: '编辑帖子' })
    async update(@Param('id') id: string, @Body() updatePostDto: CreatPostDto) {
        await PostModel.findByIdAndUpdate(id, updatePostDto)
        return {
            success: true
        }
    }

    //删除接口
    @Delete(':id')
    @ApiOperation({ summary: '删除帖子' })
    async remove(@Param('id') id: string) {
        await PostModel.findByIdAndDelete(id)
        return {
            success: true
        }
    }
}
*/